package com.ywq.train.service;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import java.beans.Transient;


@Component
public class UserService implements InitializingBean {


    @Autowired
    private OrderService orderService;

    private User defaultUser;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private UserService userService;
/*
    方式一  默认用户属性实现 通过@PostConstruct
    @PostConstruct
    public void a() {
    // mysql--->user--->defaultUser
    }
*/

/*    public UserService() {
        System.out.println(1);
    }*/

//    加上@Autowird就使用这个有参的构造函数
    public UserService(OrderService orderService) {
        this.orderService = orderService;
        System.out.println(2);
    }

  @Autowired
  //没有无参构造函数情况下，有多个有参构造函数会报错
    public UserService(OrderService orderService,OrderService orderService1) {
        //先byType 在byName
      /*在AppConfig中有声明@Bean的orderService对象，则这两个入参不是同一个对象,且找不到入参就报错
      * 如果去掉AppConfig中的声明bean则 不会报错 且是同一个对象  根据byType找到的是一个对象
      * */
        this.orderService = orderService;
        System.out.println(3);
    }
    public void test() {
        System . out . println("zhouyu");
    }
    @Transactional
    public void test2(){
        //获取数据库conn
        jdbcTemplate.execute(" insert into ssm_student(name,sex,age) values ('事务',1,21) ");
        /*throw  new NullPointerException();*/
        //同一个类下,是普通的userService调用的这个a()，不管a()的注解@Transactional如何都不会生效
//        a();
            /*userService.a();//这样执行会报错

             */
    }

    //改正方式1： 就是把这个a()方法,迁移出去 到一个a类, a类会封装成一个bean对象,他也是一个代理对象,然后通过@Autowired注入进来a的代理对象
    //改正方式2：自己注入自己
    @Transactional(propagation = Propagation.NEVER)
    public void a(){

    }

    //方式二 通过实现InitializingBean接口的afterPropertiesSet()方法
    @Override
    public void afterPropertiesSet() throws Exception {
        // mysql--->user--->defaultUser
    }

}